<?php
/**
 * 配置项控制器
 */

declare (strict_types = 1);

namespace app\controller\home;

use app\BaseController;
use think\facade\Db;
use think\facade\Request;

class Conf extends BaseController
{
    /**
     * 获取配置项列表
     */
    public function list()
    {
        try {
            $param = Request::param();
            $page = isset($param['page']) ? (int)$param['page'] : 1;
            $limit = isset($param['limit']) ? (int)$param['limit'] : 10;
            
            // 构建查询条件
            $where = [];
            $where[] = ['status', '>=', 0];
            
            // 关键词搜索
            if (!empty($param['keywords'])) {
                $where[] = ['title|name|remark', 'like', '%' . trim($param['keywords']) . '%'];
            }
            
            // 状态筛选
            if (isset($param['status']) && $param['status'] !== '') {
                $where[] = ['status', '=', $param['status']];
            }
            
            // 查询配置项列表
            $list = Db::name('config')
                ->where($where)
                ->page($page, $limit)
                ->order('id', 'desc')
                ->select()
                ->each(function($item) {
                    // 格式化时间
                    $item['create_time_format'] = date('Y-m-d H:i', $item['create_time']);
                    $item['update_time_format'] = date('Y-m-d H:i', $item['update_time']);
                    
                    // 状态名称
                    $statusNames = [
                        -1 => '删除',
                        0 => '禁用',
                        1 => '启用'
                    ];
                    $item['status_name'] = isset($statusNames[$item['status']]) ? $statusNames[$item['status']] : '未知';
                    
                    return $item;
                });
            
            // 查询总数
            $count = Db::name('config')
                ->where($where)
                ->count();
            
            return json([
                'code' => 0,
                'msg' => 'success',
                'data' => $list,
                'count' => $count
            ]);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '查询失败: ' . $e->getMessage()]);
        }
    }
    
    /**
     * 查看单个配置项信息
     */
    public function view()
    {
        try {
            $param = Request::param();
            
            if (empty($param['id'])) {
                return json(['code' => 400, 'msg' => '参数错误']);
            }
            
            // 查询配置项详情
            $conf = Db::name('config')
                ->where('id', $param['id'])
                ->find();
            
            if (empty($conf)) {
                return json(['code' => 404, 'msg' => '配置项不存在']);
            }
            
            $conf['create_time_format'] = date('Y-m-d H:i', $conf['create_time']);
            $conf['update_time_format'] = date('Y-m-d H:i', $conf['update_time']);
            
            // 状态名称
            $statusNames = [
                -1 => '删除',
                0 => '禁用',
                1 => '启用'
            ];
            $conf['status_name'] = isset($statusNames[$conf['status']]) ? $statusNames[$conf['status']] : '未知';
            
            return json([
                'code' => 0,
                'msg' => 'success',
                'data' => $conf
            ]);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '查询失败: ' . $e->getMessage()]);
        }
    }
    
    /**
     * 新建配置项
     */
    public function add()
    {
        try {
            $param = Request::param();
            
            // 数据验证
            if (empty($param['title'])) {
                return json(['code' => 400, 'msg' => '配置名称不能为空']);
            }
            
            if (empty($param['name'])) {
                return json(['code' => 400, 'msg' => '配置标识不能为空']);
            }
            
            // 检查配置标识是否已存在
            $exist = Db::name('config')
                ->where('name', $param['name'])
                ->find();
            
            if ($exist) {
                return json(['code' => 400, 'msg' => '配置标识已存在']);
            }
            
            $data = [
                'title' => $param['title'],
                'name' => $param['name'],
                'content' => $param['content'] ?? '',
                'status' => $param['status'] ?? 1,
                'create_time' => time(),
                'update_time' => time()
            ];
            
            // 新建配置项
            $confId = Db::name('config')->insertGetId($data);
            
            return json(['code' => 0, 'msg' => '保存成功', 'data' => ['id' => $confId]]);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '保存失败: ' . $e->getMessage()]);
        }
    }
    
    /**
     * 编辑配置项
     */
    public function edit()
    {
        try {
            $param = Request::param();
            
            // 数据验证
            if (empty($param['id'])) {
                return json(['code' => 400, 'msg' => '参数错误']);
            }
            
            if (empty($param['title'])) {
                return json(['code' => 400, 'msg' => '配置名称不能为空']);
            }
            
            if (empty($param['name'])) {
                return json(['code' => 400, 'msg' => '配置标识不能为空']);
            }
            
            // 检查配置项是否存在
            $conf = Db::name('config')
                ->where('id', $param['id'])
                ->find();
            
            if (empty($conf)) {
                return json(['code' => 404, 'msg' => '配置项不存在']);
            }
            
            // 检查配置标识是否已存在（排除自己）
            $exist = Db::name('config')
                ->where('name', $param['name'])
                ->where('id', '<>', $param['id'])
                ->find();
            
            if ($exist) {
                return json(['code' => 400, 'msg' => '配置标识已存在']);
            }
            
            $data = [
                'id' => $param['id'],
                'title' => $param['title'],
                'name' => $param['name'],
                'content' => $param['content'] ?? $conf['content'],
                'status' => $param['status'] ?? $conf['status'],
                'update_time' => time()
            ];
            
            // 更新配置项
            Db::name('config')->update($data);
            
            return json(['code' => 0, 'msg' => '更新成功', 'data' => ['id' => $param['id']]]);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '更新失败: ' . $e->getMessage()]);
        }
    }
    
    /**
     * 删除配置项（软删除）
     */
    public function del()
    {
        try {
            $param = Request::param();
            
            if (empty($param['id'])) {
                return json(['code' => 400, 'msg' => '参数错误']);
            }
            
            // 检查配置项是否存在
            $conf = Db::name('config')
                ->where('id', $param['id'])
                ->find();
            
            if (empty($conf)) {
                return json(['code' => 404, 'msg' => '配置项不存在']);
            }
            
            // 软删除配置项
            Db::name('config')
                ->where('id', $param['id'])
                ->update([
                    'status' => -1,
                    'update_time' => time()
                ]);
            
            return json(['code' => 0, 'msg' => '删除成功']);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '删除失败: ' . $e->getMessage()]);
        }
    }
    
    /**
     * 更新配置项值
     */
    public function updateValue()
    {
        try {
            $param = Request::param();
            
            if (empty($param['id'])) {
                return json(['code' => 400, 'msg' => '参数错误']);
            }
            
            if (!isset($param['content'])) {
                return json(['code' => 400, 'msg' => '配置内容不能为空']);
            }
            
            // 检查配置项是否存在
            $conf = Db::name('config')
                ->where('id', $param['id'])
                ->find();
            
            if (empty($conf)) {
                return json(['code' => 404, 'msg' => '配置项不存在']);
            }
            
            // 更新配置项值
            Db::name('config')
                ->where('id', $param['id'])
                ->update([
                    'content' => $param['content'],
                    'update_time' => time()
                ]);
            
            return json(['code' => 0, 'msg' => '更新成功']);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '更新失败: ' . $e->getMessage()]);
        }
    }
    
    /**
     * 获取配置项值
     */
    public function getValue()
    {
        try {
            $param = Request::param();
            
            if (empty($param['name'])) {
                return json(['code' => 400, 'msg' => '参数错误']);
            }
            
            // 查询配置项值
            $content = Db::name('config')
                ->where('name', $param['name'])
                ->where('status', 1)
                ->value('content');
            
            return json([
                'code' => 0,
                'msg' => 'success',
                'data' => $content
            ]);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '查询失败: ' . $e->getMessage()]);
        }
    }
}